package be.khl.kevinvranken.breekuit;



import java.awt.*;
import java.awt.image.*;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import javax.imageio.ImageIO;

/**
 *
 * @author kevin
 * Singleton implementatie voor de SpriteStore
 * Idee naar Kevin Glass - http://www.cokeandcode.com/info/tut2d.html
 */
public class SpriteStore {

    private static SpriteStore single = new SpriteStore();
    private HashMap sprites = new HashMap();

    public static SpriteStore get() {
        return single;
    }

    /**
     * Een sprite (geen fanta) uit de store halen
     *
     * @param referentie de referentie naar de afbeelding te gebruiken als sprite
     * @return De sprite met de referentie naar de (geaccelereerde) afbeelding
     */
    public Sprite getSprite(String referentie) {
        // Hebben we de sprite al in onze lijst? Ja -> bestaande sprite geven
        if (sprites.get(referentie) != null) {
            return (Sprite) sprites.get(referentie);
        }

        // Anders de sprite inladen
        BufferedImage sourceImage = null;

        try {
            URL url = this.getClass().getResource(referentie);

            if (url == null) {
                fail("Kan volgende referentie niet vinden: " + referentie);
            }
            sourceImage = ImageIO.read(url);
        } catch (IOException e) {
            fail("Kon niet laden: " + referentie);
        }

        // geaccelereerde afbeelding maken

        GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
        Image image = gc.createCompatibleImage(sourceImage.getWidth(), sourceImage.getHeight(), Transparency.BITMASK);

        // bronafbeelding tekenen in de geacceleerde afbeelding

        image.getGraphics().drawImage(sourceImage, 0, 0, null);

        // sprite maken en opslaan

        Sprite sprite = new Sprite(image);
        sprites.put(referentie, sprite);

        return sprite;
    }

    /**
     * Afhandelen van fouten bij inlezen sprite
     *
     * @param bericht De foutenboodschap
     */
    private void fail(String bericht) {
        System.err.println(bericht);
        System.exit(0);
    }
}